package com.leeue.utils;

import sun.misc.BASE64Encoder;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.*;

/**
 * Copyright (C), 2011-2018 {company} FileName:
 * com.huateng.util.KeyPairGenUtil.java Author: xxx Email: xxx Date: 2018/6/6
 * 14:01 Description: History: <Author> <Time> <version> <desc> {xxx} 14:01 1.0
 * Create
 */
public class KeyPairGenUtil {
	/** 指定加密算法为RSA */
	private static final String ALGORITHM = "RSA";
	/** 密钥长度，用来初始化 */
	private static final int KEYSIZE = 2048;
	/** 指定公钥存放文件 */
	private static String PUBLIC_KEY_FILE = "merkey.public";
	/** 指定私钥存放文件 */
	private static String PRIVATE_KEY_FILE = "merkey.private";

	public static void main(String[] args) throws Exception {
		// 生成公私钥文件
		generateKeyPair();
		// 生成公私钥字符串
		genKeyPair();
	}

	/**
	 * 生成密钥对
	 * 
	 * @throws Exception
	 */
	private static void generateKeyPair() throws Exception {

		// /** RSA算法要求有一个可信任的随机数源 */
		// SecureRandom secureRandom = new SecureRandom();
		/** 为RSA算法创建一个KeyPairGenerator对象 */
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);

		/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
		// keyPairGenerator.initialize(KEYSIZE, secureRandom);
		keyPairGenerator.initialize(KEYSIZE);

		/** 生成密匙对 */
		KeyPair keyPair = keyPairGenerator.generateKeyPair();

		/** 得到公钥 */
		Key publicKey = keyPair.getPublic();

		/** 得到私钥 */
		Key privateKey = keyPair.getPrivate();

		ObjectOutputStream oos1 = null;
		ObjectOutputStream oos2 = null;
		try {
			/** 用对象流将生成的密钥写入文件 */
			oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
			oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
			oos1.writeObject(publicKey);
			oos2.writeObject(privateKey);
		} catch (Exception e) {
			throw e;
		} finally {
			/** 清空缓存，关闭文件输出流 */
			if (oos1 != null) {
				oos1.close();
			}
			if (oos2 != null) {
				oos2.close();
			}
		}
	}

	private static void genKeyPair() throws NoSuchAlgorithmException {

		/** RSA算法要求有一个可信任的随机数源 */
		SecureRandom secureRandom = new SecureRandom();

		/** 为RSA算法创建一个KeyPairGenerator对象 */
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);

		/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
		keyPairGenerator.initialize(KEYSIZE, secureRandom);
		// keyPairGenerator.initialize(KEYSIZE);

		/** 生成密匙对 */
		KeyPair keyPair = keyPairGenerator.generateKeyPair();

		/** 得到公钥 */
		Key publicKey = keyPair.getPublic();

		/** 得到私钥 */
		Key privateKey = keyPair.getPrivate();

		byte[] publicKeyBytes = publicKey.getEncoded();
		byte[] privateKeyBytes = privateKey.getEncoded();

		String publicKeyBase64 = new BASE64Encoder().encode(publicKeyBytes);
		String privateKeyBase64 = new BASE64Encoder().encode(privateKeyBytes);

		System.out.println("公钥:" + publicKeyBase64);
		System.out.println("###############################################################");
		System.out.println("私钥:" + privateKeyBase64);
	}
}